---
id: 301
title: MqttClient
---


import useBaseUrl from "@docusaurus/useBaseUrl";
import Tag from "@site/src/components/Tag.js";
import Highlight from '@site/src/components/Highlight.js';

:::tip `提示`

通过自定义脚本，可快速适配业务模型，比如各大云平台的Iot物模型

脚本的示例请查看**常见问题**

:::

## 一、说明

MqttClient通过Tcp/WebSocket的方式，发布内容到Broker(Server)，可以定时/变化发布数据


通道只支持 Other 

## 二、插件属性配置项

<img src={require("@site/static/img/docs/MqttClient.png").default} />

| 属性           |  说明                    | 备注|
| ---------------| --------------------------| ---|
| IP         | ServerIP,为空时指任意IP              | |
| 端口         | 连接端口              | 1883|
| 是否WebSocket连接         | 是否WebSocket连接             | False |
| WebSocketUrl         | WebSocketUrl             | ws://127.0.0.1:8083/mqtt |
| 账号         | 账号             |  |
| 密码         | 密码              |  |
| 连接Id         | 连接Id              |  |
| 连接超时时间         | 连接超时时间              |  |
| 允许Rpc写入         | 是否允许写入变量              |  |
| Rpc写入Topic         | 写入变量的主题              | 实际的写入主题为固定通配 {ThingsGateway.Rpc/+/[填入值]} ,其中RpcWrite为该属性填入内容，+通配符是不固定GUID值，每次执行写入时会在不同的主题中返回；返回结果主题会在主题后添加Response , 也就是{ThingsGateway.Rpc/+/[填入值]/Response} |
| 数据请求Topic        | 该主题接受到任何消息都会发布全部信息到对应的变量/设备/报警主题中             |  |
| 设备是否列表         | 设备是否列表上传，false时每个设备实体都会单独发布，注意性能需求，默认为true             |  |
| 变量是否列表         | 变量是否列表上传，false时每个变量实体都会单独发布，注意性能需求，默认为true             |  |
| 报警是否列表         | 报警是否列表上传，false时每个报警实体都会单独发布，注意性能需求，默认为true             |  |
| 设备Topic         | 设备实体的发布主题 ，使用${key}作为匹配项，key必须是上传实体中的属性            |  |
| 变量Topic         | 变量实体的发布主题 ，使用${key}作为匹配项，key必须是上传实体中的属性            |  |
| 报警Topic         | 报警实体的发布主题 ，使用${key}作为匹配项，key必须是上传实体中的属性            |  |
| 设备实体脚本         | 脚本返回新的实体列表，动态类中需继承**IDynamicModel**，传入列表为**DeviceData**,查看以下具体属性            | 编辑页面中，可通过检查按钮验证脚本，脚本示例请查看**常见问题**  |
| 变量实体脚本         | 脚本返回新的实体列表，动态类中需继承**IDynamicModel**，传入列表为**VariableData**,查看以下具体属性            | 编辑页面中，可通过检查按钮验证脚本，脚本示例请查看**常见问题** |
| 报警实体脚本         | 脚本返回新的实体列表，动态类中需继承**IDynamicModel**，传入列表为**AlarmVariable**,查看以下具体属性            | 编辑页面中，可通过检查按钮验证脚本，脚本示例请查看**常见问题** |
| 是否选择全部变量         | 是否选择全部变量，true时不需要单个变量添加业务属性            |  |
| 是否间隔执行         | 是否选择全部变量，true间隔上传，False变化检测上传            |  |
| 间隔执行时间         | 间隔执行时间           |  |
| 启用缓存         | 是否启用缓存           |  |
| 上传列表最大数量         | 每一次上传的列表最大数量           |  |
| 内存队列最大数量         | 内存队列的最大数量，超出或失败时转入文件缓存，根据数据量设定适当值           |  |

### 脚本接口
```

public interface IDynamicModel
{
    IEnumerable<dynamic> GetList(IEnumerable<dynamic> datas);
}


```

### DeviceData
```

/// <summary>
/// 设备业务变化数据
/// </summary>
public class DeviceData
{
    /// <inheritdoc cref="PrimaryIdEntity.Id"/>
    public long Id { get; set; }

    /// <inheritdoc cref="Device.Name"/>
    public string Name { get; set; }

    /// <inheritdoc cref="DeviceRunTime.ActiveTime"/>
    public DateTime ActiveTime { get; set; }

    /// <inheritdoc cref="DeviceRunTime.DeviceStatus"/>
    public DeviceStatusEnum DeviceStatus { get; set; }

    /// <inheritdoc cref="DeviceRunTime.LastErrorMessage"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string LastErrorMessage { get; set; }

    /// <inheritdoc cref="Device.Remark1"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark1 { get; set; }

    /// <inheritdoc cref="Device.Remark2"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark2 { get; set; }

    /// <inheritdoc cref="Device.Remark3"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark3 { get; set; }

    /// <inheritdoc cref="Device.Remark4"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark4 { get; set; }

    /// <inheritdoc cref="Device.Remark5"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark5 { get; set; }
}

```

### VariableData
```

/// <summary>
/// 变量业务变化数据
/// </summary>
public class VariableData
{
    /// <inheritdoc cref="PrimaryIdEntity.Id"/>
    public long Id { get; set; }

    /// <inheritdoc cref="Variable.Name"/>
    public string Name { get; set; }

    /// <inheritdoc cref="VariableRunTime.DeviceName"/>
    public string DeviceName { get; set; }

    /// <inheritdoc cref="VariableRunTime.Value"/>
    public object Value { get; set; }

    /// <inheritdoc cref="VariableRunTime.ChangeTime"/>
    public DateTime ChangeTime { get; set; }

    /// <inheritdoc cref="VariableRunTime.CollectTime"/>
    public DateTime CollectTime { get; set; }

    /// <inheritdoc cref="VariableRunTime.IsOnline"/>
    public bool IsOnline { get; set; }

    /// <inheritdoc cref="VariableRunTime.LastErrorMessage"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string? LastErrorMessage { get; set; }

    /// <inheritdoc cref="Device.Remark1"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark1 { get; set; }

    /// <inheritdoc cref="Device.Remark2"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark2 { get; set; }

    /// <inheritdoc cref="Device.Remark3"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark3 { get; set; }

    /// <inheritdoc cref="Device.Remark4"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark4 { get; set; }

    /// <inheritdoc cref="Device.Remark5"/>
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark5 { get; set; }
}

```

### AlarmVariable
```

/// <summary>
/// 报警变量
/// </summary>
public class AlarmVariable
{
    /// <inheritdoc  cref="Variable.Name"/>
    [SugarColumn(ColumnDescription = "变量名称", IsNullable = false)]
    public string Name { get; set; }

    /// <inheritdoc  cref="Variable.Description"/>
    [SugarColumn(ColumnDescription = "描述", IsNullable = true)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string? Description { get; set; }

    /// <inheritdoc  cref="VariableRunTime.DeviceName"/>
    [SugarColumn(ColumnDescription = "设备名称", IsNullable = true)]
    public string DeviceName { get; set; }

    /// <inheritdoc  cref="Variable.RegisterAddress"/>
    [SugarColumn(ColumnDescription = "变量地址")]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string RegisterAddress { get; set; }

    /// <inheritdoc  cref="Variable.DataType"/>
    [SugarColumn(ColumnDescription = "数据类型", ColumnDataType = "varchar(100)")]
    public DataTypeEnum DataType { get; set; }

    /// <inheritdoc  cref="VariableRunTime.AlarmCode"/>
    [SugarColumn(ColumnDescription = "报警值", IsNullable = false)]
    public string AlarmCode { get; set; }

    /// <inheritdoc  cref="VariableRunTime.AlarmLimit"/>
    [SugarColumn(ColumnDescription = "报警限值", IsNullable = false)]
    public string AlarmLimit { get; set; }

    /// <inheritdoc  cref="VariableRunTime.AlarmText"/>
    [SugarColumn(ColumnDescription = "报警文本", IsNullable = true)]
    public string? AlarmText { get; set; }

    /// <inheritdoc  cref="VariableRunTime.AlarmTime"/>
    [SugarColumn(ColumnDescription = "报警时间", IsNullable = false)]
    public DateTime AlarmTime { get; set; }

    /// <inheritdoc  cref="VariableRunTime.EventTime"/>
    public DateTime EventTime { get; set; }

    /// <summary>
    /// 报警类型
    /// </summary>
    public AlarmTypeEnum? AlarmType { get; set; }

    /// <summary>
    /// 事件类型
    /// </summary>
    public EventTypeEnum EventType { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark1 { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark2 { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark3 { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark4 { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string Remark5 { get; set; }
}

```

## 三、变量业务属性

### 允许写入

单独配置变量是否允许写入



## 四、Rpc

### 1、请求内容

MqttRpc的请求内容与WebApi一致，请求参数为Dictionary<string, string>，比如

```
{

  "D500":"1"

}
```

键为变量名称，值为写入参数值

### 2、请求主题

请求主题在配置属性中设置，查看**Rpc写入Topic**

注意，实际的请求主题为 `{ThingsGateway.Rpc/[自定义GUID或者雪花ID]/[Rpc写入Topic]}`


### 3、Rpc返回主题

`{ThingsGateway.Rpc/[自定义GUID或者雪花ID]/[Rpc写入Topic]/Response}`

### 4、图示

<img src={require("@site/static/img/docs/MqttRpc.png").default} />
